home *** CD-ROM | disk | FTP | other *** search
/ Aminet 50 / Aminet 50 (2002)(GTI - Schatztruhe)[!][Aug 2002].iso / Aminet / text / edit / tecoc-146.lha / exex.c < prev    next >
C/C++ Source or Header  |  1991-07-05  |  3KB  |  108 lines

  1. /*****************************************************************************
  2.  
  3.     ExeX()
  4.  
  5.     This function executes an X command.
  6.  
  7.     nXq    Put n lines into Q-register q
  8.     m,nXq    Put characters m to n into Q-register q
  9.     n:Xq    Append n lines to Q-register q
  10.     m,n:Xq    Append characters m to n into Q-register q
  11. *****************************************************************************/
  12.  
  13. #include "zport.h"        /* define portability identifiers */
  14. #include "tecoc.h"        /* define general identifiers */
  15. #include "defext.h"        /* define external global variables */
  16. #include "deferr.h"        /* define identifiers for error messages */
  17.  
  18. DEFAULT ExeX()            /* execute an X command */
  19. {
  20.     ptrdiff_t TmpSiz;
  21.  
  22.     DBGFEN(1,"ExeX",NULL);
  23.     if (EStTop == EStBot) {            /* if no numeric argument */
  24.         NArgmt = 1;            /* default is 1X */
  25.     } else {
  26.         UMinus();            /* if it's -X, make it -1X */
  27.         if (GetNmA() == FAILURE) {    /* get numeric argument */
  28.             DBGFEX(1,DbgFNm,"FAILURE, GetNmA() failed");
  29.             return FAILURE;
  30.         }
  31.     }
  32.  
  33.  
  34.     if (IncCBP() == FAILURE) {        /* move to char after X */
  35.         DBGFEX(1,DbgFNm,"FAILURE, IncCBP() failed");
  36.         return FAILURE;
  37.     }
  38.  
  39.     if (FindQR() == FAILURE) {        /* find q-register values */
  40.         DBGFEX(1,DbgFNm,"FAILURE, FindQR() failed");
  41.         return FAILURE;
  42.     }
  43.  
  44.     if (!(CmdMod & COLON)) {        /* if no colon modifier */
  45.         if (QR->Start != NULL) {    /* if text area not empty */
  46.             ZFree((voidptr)QR->Start);/* free allocated memory */
  47.             QR->Start = QR->End_P1 = NULL;
  48.         }
  49.     }
  50.  
  51.     if ((CmdMod & MARGIS) == '\0') {    /* if it's nXq (not m,nXq) */
  52.         NArgmt = Ln2Chr(NArgmt);
  53.         if (NArgmt > 0) {
  54.             if (MakRom((SIZE_T)NArgmt) == FAILURE) {
  55.                 DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
  56.                 return FAILURE;
  57.             }
  58.             MEMMOVE(QR->End_P1, GapEnd+1, (SIZE_T)NArgmt);
  59.             QR->End_P1 += NArgmt;
  60.         } else if (NArgmt < 0) {
  61.             if (MakRom((SIZE_T)-NArgmt) == FAILURE) {
  62.                 DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
  63.                 return FAILURE;
  64.             }
  65.             MEMMOVE(QR->End_P1, GapBeg+NArgmt, (SIZE_T)-NArgmt);
  66.             QR->End_P1 -= NArgmt;
  67.         }
  68.     } else if (NArgmt != MArgmt) {        /* else (it's m,nXq) */
  69.         MEMMOVE(ErrTxt, "m,nX", 5);
  70.         if (GetAra() == FAILURE) {
  71.             DBGFEX(1,DbgFNm,"FAILURE, GetAra() failed");
  72.             return FAILURE;
  73.         }
  74.         if ((AraBeg < GapBeg) && (AraEnd > GapEnd)) {
  75.             TmpSiz = (GapBeg-AraBeg) + (AraEnd-GapEnd);
  76.             if (TmpSiz > 0) {
  77.                 if (MakRom((SIZE_T)TmpSiz) == FAILURE) {
  78.                     DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
  79.                     return FAILURE;
  80.                 }
  81.                 MEMMOVE(QR->End_P1,
  82.                     AraBeg,
  83.                     (SIZE_T)(GapBeg - AraBeg));
  84.                 QR->End_P1 += GapBeg-AraBeg;
  85.                 MEMMOVE(QR->End_P1,
  86.                     GapEnd+1,
  87.                     (SIZE_T)(AraEnd - GapEnd));
  88.                 QR->End_P1 += AraEnd-GapEnd;
  89.             }
  90.         } else {            /* else area is contiguous */
  91.             TmpSiz = (AraEnd - AraBeg) + 1;
  92.             if (TmpSiz > 0) {
  93.                 if (MakRom((SIZE_T)TmpSiz) == FAILURE) {
  94.                     DBGFEX(1,DbgFNm,"FAILURE, MakRom() failed");
  95.                     return FAILURE;
  96.                 }
  97.                 MEMMOVE(QR->End_P1, AraBeg, (SIZE_T)TmpSiz);
  98.                 QR->End_P1 += TmpSiz;
  99.             }
  100.         }
  101.     }
  102.  
  103.     CmdMod = '\0';            /* clear modifiers flags */
  104.  
  105.     DBGFEX(1,DbgFNm,"SUCCESS");
  106.     return SUCCESS;
  107. }
  108.